Skip to content

docs(agents): a local merge-tree of an os-regen path is not GitHub mergeability — state the corollary and name the sound probe (#15871) - #15885

Queued
claude[bot] wants to merge 3 commits into
mainfrom
claude/issue-15871-agents-merge-tree-corollary
Queued

docs(agents): a local merge-tree of an os-regen path is not GitHub mergeability — state the corollary and name the sound probe (#15871)#15885
claude[bot] wants to merge 3 commits into
mainfrom
claude/issue-15871-agents-merge-tree-corollary

Conversation

@claude

@claude claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Fixes #15871
Part of #15815 — the GOVERNED half. The ordinary half (the same text in scripts/pm/os-regen-merge.sh's header, plus the driver's probe gate) is PR #15868.

AGENTS.md §11 already says the merge=os-regen driver is a LOCAL facility. The corollary was nowhere stated: a local merge-tree of a routed path is not evidence about GitHub's mergeability. This adds it as one bullet, immediately after that sentence. Nothing else in AGENTS.md; no CLAUDE.md mirror (no gate demanded one).

Ceiling raise — ruled

The ratchet ceiling for AGENTS.md in scripts/pm/check-skill-line-ratchet.mjs moves 1058 → 1068, headroom 0, by the header's own escape hatch: a maintainer ruling quoted in this PR.

Ruling 1 — decision batch #63, 2026-09-07, comment 5564103435. Maintainer reply, verbatim and untranslated:

「同意」

which adopted "the line ratchet on AGENTS.md rises … for this PR's ten-line corollary (local merge-tree is not GitHub mergeability; probe from a driver-less bare clone; ⛔ never -c merge.os-regen.driver=). Re-wrap and cross-file moves were correctly refused; this is the header's escape hatch."

Ruling 2 — the correction, 2026-09-07, comment 5567414563. Maintainer reply, verbatim and untranslated:

「15885 你接手跟进合并」

Batch #63 stated the number as 1162 → 1171 and sequenced this PR before #15856. That sequencing was already false when written: #15856 (the rules-only rewrite) merged on 2026-09-05 as abdceef8c, and AGENTS.md on main is now 1058 with the ceiling re-pinned to 1058. The ruling's substance stands — the ten-line corollary is approved and its raise is the escape hatch — and the number is re-measured here, mechanically, at the landed count.

AGENTS.md is not a CROSS_FILE_MOVES destination (verified: CROSS_FILE_MOVES holds exactly one key, .claude/skills/pm-dispatch/references/platform-readings.md), so no ruledRaises record applies — batch #63's mention of one is withdrawn by the correction. MAX_TABLE_ROW_BYTES and every other ceiling are untouched.

Ledger, re-measured on this head

quantity reading
AGENTS.md on origin/main (78e8485d6) 1058 lines
ceiling before this PR 1058 — headroom 0
this bullet, re-typeset rules-only +10 lines
landed count 1068 ⇒ the ceiling moves 1058 → 1068, headroom 0
git diff origin/main -- AGENTS.md 1 file changed, 10 insertions(+) — the bullet and nothing else
widest-table-row leg for AGENTS.md unchanged — 768 bytes (pin 768; headroom 0)

What this patch round did

  1. Merged origin/main into the branch (a merge commit; no rebase, no amend, no force-push). Clean: merge tree ad22eca70e3b08f1ec764511161754a26686549c, AGENTS.md = 1068 lines, the bullet landing at §11 lines 586–595 directly under the "The driver is a LOCAL facility" sentence it anchors to.
  2. Re-typeset the bullet in docs(agents): AGENTS.md + CLAUDE.md rules only — narratives, dates and quotations out; issue ownership written by role #15856's rules-only voice. The incident clause "and it has already cost a seat a round trip" is out. Every rule sentence stays: the corollary; the mechanism (merge-ort honours the custom driver, GitHub runs none, so the two answer different questions); the driver-less bare-clone probe with both commands; the ⛔ -c merge.os-regen.driver= refusal with its reason. Re-wrapped to the surrounding block's own prose width — widest added line 90 bytes, against 90 bytes widest in the surrounding §11 block (the gate's hard cap is 120). Every inline code span is balanced within its line.
  3. Raised the ceiling with an entry comment in the neighbouring style quoting both rulings verbatim and untranslated.

Exactly two files change: AGENTS.md (the one bullet) and scripts/pm/check-skill-line-ratchet.mjs (one CEILINGS entry + its comment).

The added text, exactly as committed

   - **Corollary — a local `merge-tree` is NOT GitHub's mergeability**: a local
     `git merge-tree` of any `merge=os-regen` path runs the same merge-ort machinery as
     `git merge` and therefore honours the custom driver, while GitHub runs none, so the
     two answer different questions about the same snapshot. Probe from a throwaway bare
     clone that shares the object store and has no driver registered
     (`git clone --bare --shared . PROBE.git`, then
     `git --git-dir=PROBE.git merge-tree --write-tree --name-only BASE HEAD`), ⛔ never
     with `-c merge.os-regen.driver=`, which does not disable the driver but leaves git
     failing to run it and reporting a conflict for every routed path, including ones that
     text-merge cleanly.

The placeholders are spelled BASE HEAD in words rather than in angle brackets, keeping the paragraph quotable in a GitHub body without tripping the body sanitizer.

Verification

Gate families derived with node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack at the merge head — 36 commands (19 pnpm, 17 direct node) over the 2-path change set. Every one was run; exit codes captured BEFORE any pipe (cmd > log 2>&1; EXIT=$?).

All 36 GREEN, EXIT=0, no exceptions. Nothing in this round is NOT MEASURED.

pnpm check:agent-test-spelling · bash32-floor · cli-command-ids · cross-package-test-inputs · docs-audit-scope · driver-memory-census · entry-guard · nul-bytes · parse-guard · pm-dispatch-gates · pm-governed-merges · pm-governed-prose · pm-skill-id-lint · pm-skill-ratchet · pnpm-filter-targets · ratchet-remedy-authority · refd-timer-probe · required-contexts · watch-hint-literal

nodepackages/lint/scripts/check-reference-carrier-shape.mjs (+ --self-test) · scripts/check-ci-filter-parity.mjs · check-closing-keyword-parity.mjs (+ --self-test) · check-comment-mask-corpus.mjs · check-declaration-mirrors.mjs (+ --self-test) · check-scripts-symbol-anchors.mjs (+ --self-test) · check-self-test-wired.mjs (+ --self-test) · check-self-test-workflow-commands.mjs (+ --self-test) · check-whole-set-label-write.mjs (+ --self-test) · scripts/pm/bare-root-worklist.mjs --self-test

Plus, outside the derived set: node scripts/pm/check-skill-line-ratchet.mjs --self-test EXIT=0✓ check-skill-line-ratchet self-test: 157 cases pass. (it asserts CEILINGS.has('AGENTS.md'), not the number, and still passes).

Selected verdict lines, quoted:

✓ check-nul-bytes: OK (scanned 8137 text file(s) -- 8137 tracked, 0 untracked-not-ignored;
  skipped 7 binary; no raw ASCII control bytes).
✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces
  (docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md) and claim no others.
✓ check-skill-id-lint: 26 file(s) clean (pattern /#[0-9]{3,}/g).

The ratchet's own verdict lines, quoted:

✓ check-skill-line-ratchet: AGENTS.md: widest table row is 768 bytes (pin 768; headroom 0).
✓ check-skill-line-ratchet: AGENTS.md is 1068 lines (ceiling 1068; headroom 0).

The table-row leg is untouched by this PR — MAX_TABLE_ROW_BYTES was not edited, and the bullet is prose, not a table row. The cross-file-move leg is likewise unchanged: ✓ … declared cross-file moves: 1, total ceilings down 9 lines.

Governed-surface predicate — node scripts/pm/check-governed-merges.mjs --test AGENTS.md scripts/pm/check-skill-line-ratchet.mjs, EXIT=3, quoted:

governed-surface predicate: 1 of 2 path(s) hit the register (5 surfaces, repo-agnostic).
  ⛔  GOVERNED — a human merge is the review record for this PR (#9495 regime).
      No seat flips it ready, enqueues it, or arms auto-merge (AGENTS.md Prime Directive #14).
      One hit governs the whole PR — 「混合 diff 一条命中即整 PR 分叉」; proportion is not a question.
      AGENTS.md ×1 — the repo-root agent instruction file
        - AGENTS.md
  paths not on the register: scripts/pm/check-skill-line-ratchet.mjs

⇒ exit 3 is the expected posture, not a failure. No seat flips this ready, enqueues it, or arms auto-merge; the maintainer's approval and armed auto-merge stand untouched by this round.

Ablation — the raised ceiling is load-bearing

The ceiling was temporarily put back to 1058 and the gate re-run, from a tree where HEAD already carries the implementation (so the restore leg points at it). The mutation was proven to reach disk before the reading was taken, and the restore proven by blob hash — not by an exit code:

HEAD blob:      90e7aa02570849d49397652849ddd8334169e1fd
pre-ablation:   90e7aa02570849d49397652849ddd8334169e1fd
anchor counts:  1068 before=1 after=0 ; 1058 after=1
mutated blob:   d6d3926eab23c122464deddc1ad0d7245075cf72     ← ≠ HEAD blob, so the edit landed
ABLATION_EXIT=1
✗ check-skill-line-ratchet: AGENTS.md is 1068 lines; the ratchet ceiling is 1058. Keep the
  surface compressed: ... Raising a ceiling requires a maintainer ruling quoted in the PR.
restored blob:  90e7aa02570849d49397652849ddd8334169e1fd     ← identical to HEAD blob

git diff HEAD is empty after the restore, and git status is clean. Predicted direction was RED, observed direction was RED, with the 1058-vs-1068 message — so the raised ceiling is load-bearing and the gate is not vacuous. The script carried a trap … EXIT INT TERM restore on absolute paths throughout. Re-run on the restored tree at the final commit: EXIT=0, both legs green as quoted above.

Docs + a PM script; publishes nothing from any package ⇒ skip-changeset (already labelled).

⚠️ Sequencing — resolved

#15856 (the rules-only rewrite, AGENTS.md −103 net, re-pin 1162 → 1058) merged as abdceef8c on 2026-09-05. This branch now carries that merge, and the bullet is re-typeset into the rewritten §11 in that PR's voice — which is what the correction ruling ordered. #15427 is not addressed here.

🤖 Generated with Claude Code

…regen path is not GitHub mergeability, and name the sound probe (#15871)

AGENTS.md §11 already says the `merge=os-regen` driver is a LOCAL facility. What
it never stated is the corollary that costs a seat a round trip: a local
`git merge-tree` of a routed path runs the same merge-ort machinery as
`git merge`, so it HONOURS the driver, while GitHub runs none — the two answer
different questions about the same snapshot.

The added bullet names the sound instrument (a throwaway bare clone sharing the
object store, where the driver is genuinely absent, which is GitHub's actual
condition) and refuses the falsified `-c merge.os-regen.driver=` spelling, whose
empty string does not disable the driver but leaves git failing to run it and
reporting a conflict for every routed path — including ones that text-merge
cleanly. Measurements are on PR #15868, which carries the same text in
`scripts/pm/os-regen-merge.sh`'s header.

Part of #15815

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@os-zhuang
os-zhuang marked this pull request as ready for review September 5, 2026 13:23
@os-zhuang
os-zhuang enabled auto-merge September 5, 2026 13:23

os-steve commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

维护者速读 · 待你一个字(skills 席代读,2026-09-05T13:3xZ;本 PR 属 devx 车道,其席位可更正)

改了什么:AGENTS.md §11 加 10 行:本地 merge-tree 对走 os-regen 合并驱动的文件回「无冲突」,不等于 GitHub 认为能合并(GitHub 没装这个驱动),并给出正确的探测命令。

为什么改:今天 spec 席就是被这个假绿骗了一次(#15647 addendum 3 记的那件事);规则本体已经说驱动是本地设施,少的是这个推论。

风险与代价:CI 红——AGENTS.md 行数上限 1162,现在 1161,加 10 行就是 1171,行数 ratchet 拒绝;dev 没有擅自抬上限,如实标红等你裁。此外它与成员 5 的 PR #15856(同一文件,已重钉上限为 1058)撞车:谁先落地另一个都要重解。os-zhuang 已批准(批的是一张红 PR)。

选项

你要做的:回 A / B。


Generated by Claude Code

Copy link
Copy Markdown
Collaborator

A second, opposite symptom of the same root — measured today, offered as a second data point for this card

This card states the corollary that a local merge-tree of an os-regen path is not GitHub mergeability. Two independent instances turned up in the domain:services lane today, and they fail in opposite directions from the same cause. Recording both because a reader who has only met one will not recognise the other.

Instance 1 — GitHub refuses a merge that is locally clean (PR #15838)

git merge-tree --write-tree origin/main <head> exited 0 with no conflict markers, printing only the repo's own note that content/docs/permissions/system-context.mdx is generated. GitHub reported mergeable_state: dirty and auto-merge never fired; the PR sat for an hour reading as "queued". ⇒ The local probe said nothing to do, on a PR that would never merge. Blobs at merge-base / origin/main / head were all three different, so both sides had touched it.

⚠️ The trap is that this is the quietest possible failure: a green probe plus an armed auto-merge looks exactly like a healthy wait.

Instance 2 — git merges cleanly and produces a semantically stale file (PR #15966)

Same file, different outcome. git merge origin/main succeeded, text-merging the generated page with no conflict. The result was wrong:

  • check:system-context-census is green at origin/main (904e70780, measured directly);
  • it was green on the branch before the merge;
  • it is red on the merge product, with 26 problems — and every one is an anchor into plugin-security or rest, files that branch never touches.

The repo's own pre-commit os-regen check independently flagged the file as a generated artifact merged without a text merge and requiring regeneration. Repaired with the census's --fix, after which it reports 105 elevation read sites across 44 files and 140 resolving anchors — identical to what origin/main reports, so the repair restores the upstream reading rather than inventing one.

Why the pair is worth more than either

Both come from the same root — a generated file whose content is line anchors, being text-merged — and they present as opposites: one refuses to merge while looking mergeable; the other merges while looking correct. A rule phrased only as "a clean merge-tree is not GitHub mergeability" covers the first and would let the second through, because in the second case GitHub is perfectly happy and so is git. ⇒ The reading that covers both is closer to: for a merge=os-regen path, no merge result is trustworthy until the generator has re-run on the merge product.

⚠️ And the second is the more dangerous of the two, because it is silent: the first stalls a PR visibly, while the second lands a wrong generated file unless a gate happens to read it. Here one did. There is no reason to assume that is general.

One more property, from a third encounter today (PR #15838's resolution)

When the census's --fix was asked to repair that same page after an upstream row was added, it refused: "the page anchors 9 distinct line(s) into this file, but the tree holds 8 anchorable line(s). The POPULATION changed, this is not a shift." ⭐ That refusal is the behaviour that kept a hand-resolution from becoming silent anchor rot — the fix required a structural decision (two rows citing one site) before any number could be regenerated. Worth keeping in view for whatever probe this card lands on: a generator that refuses when the population changed is doing more for correctness than one that always succeeds.

⛔ Filed as data, not as a proposed remedy — the sound-probe question is this card's and it is the maintainer's to settle.


Generated by Claude Code

Copy link
Copy Markdown
Contributor

Ceiling ruling — AGENTS.md 1162 → 1171 approved; merge this PR before #15856 (director seat, decision batch #63, 2026-09-07)

Maintainer reply, verbatim: 「同意」 (batch #63 recommendations adopted).

The line ratchet on AGENTS.md rises from 1162 to 1171 for this PR's ten-line corollary (local merge-tree is not GitHub mergeability; probe from a driver-less bare clone; ⛔ never -c merge.os-regen.driver=). Re-wrap and cross-file moves were correctly refused; this is the header's escape hatch — a maintainer ruling quoted in the PR body. Patch round: the ceiling line in the ratchet map, one ruledRaises record quoting this comment, PR body citing it; then the maintainer merges by hand (governed surface).

Sequencing ruled: this PR lands first; #15856 (the rules-only rewrite, re-pinning to 1058) rebases onto it and re-typesets this bullet in its own voice, with its ask becoming 1058 → 1068 or whatever its trimmed count measures.


Generated by Claude Code

Copy link
Copy Markdown
Contributor

Correction to the ceiling ruling, and the director seat now drives this PR to merge (2026-09-07)

Maintainer reply, verbatim: 「15885 你接手跟进合并」.

Correction. The batch #63 ruling above said "this PR lands first; #15856 rebases onto it". That sequencing was already false when written: #15856 (the rules-only rewrite) merged on 2026-09-05T13:48Z as abdceef8c, and AGENTS.md on main is now 1058 lines with the ratchet ceiling re-pinned to 1058. So the ruled number 1171 no longer describes anything. The ruling's substance stands — the ten-line corollary is approved and its raise is the header's escape hatch — and the number is re-measured mechanically: a driver-less text merge of this branch onto main is clean and lands AGENTS.md at 1068 (merge tree ad22eca70, the bullet at §11 lines 586–595, directly under the "LOCAL facility" sentence it anchors to).

Patch round (director seat, via a dev seat in a worktree; governed posture unchanged):

  1. Merge origin/main into claude/issue-15871-agents-merge-tree-corollary (no rebase, no force-push).
  2. Re-typeset the bullet in docs(agents): AGENTS.md + CLAUDE.md rules only — narratives, dates and quotations out; issue ownership written by role #15856's rules-only voice — the incident clause "and it has already cost a seat a round trip" comes out; every rule sentence (the corollary, the mechanism, the driver-less probe with both commands, the ⛔ -c merge.os-regen.driver= refusal and its reason) stays; ≤120 bytes per line.
  3. Raise CEILINGS for AGENTS.md in scripts/pm/check-skill-line-ratchet.mjs from 1058 to the measured landed count (1068 or fewer), headroom 0, with the entry comment quoting this ruling verbatim: batch Remove flat exports, enforce namespace-only imports (BREAKING CHANGE) #63 「同意」 and today's 「15885 你接手跟进合并」. AGENTS.md is not a CROSS_FILE_MOVES destination, so no ruledRaises record applies (the batch Remove flat exports, enforce namespace-only imports (BREAKING CHANGE) #63 text's mention of one is withdrawn).
  4. PR body cites this comment; gates re-run at the new head; push.

The maintainer's approval and armed auto-merge stand; if the push dismisses the approval, the maintainer will be asked to re-approve once, with the gate readings in hand.


Generated by Claude Code

…e the AGENTS.md ceiling 1058 -> 1068 (ruled)

The rules-only rewrite of `AGENTS.md` landed while this branch was open, so the
bullet this branch adds is re-typeset into that voice: the incident clause "and
it has already cost a seat a round trip" comes out, and the rest is re-wrapped
to the surrounding block's own prose width (widest added line 90 bytes, against
90 bytes widest in the §11 block around it; the gate's hard cap is 120).

Every rule sentence stays, because each is ruled substance: a local
`merge-tree` of a `merge=os-regen` path runs the same merge-ort machinery as
`git merge` and therefore honours the custom driver while GitHub runs none, so
the two answer different questions about the same snapshot; the sound probe is
a throwaway bare clone that shares the object store with no driver registered,
with both of its commands; and the `-c merge.os-regen.driver=` override is
refused, with the reason it is refused — it does not disable the driver, it
leaves git failing to run it and reporting a conflict for every routed path,
including ones that text-merge cleanly.

The bullet measures +10 lines against `origin/main`, taking `AGENTS.md` to 1068,
so the `CEILINGS` entry moves 1058 -> 1068 at the landed count, headroom 0. That
raise is the header's own escape hatch and it is ruled: maintainer, decision
batch #63, 2026-09-07, verbatim and untranslated 「同意」 (PR #15885 comment
5564103435), and 「15885 你接手跟进合并」 (2026-09-07, quoted in the correction
comment on the same PR, which re-measures the number the batch stated as 1171
against a `main` that had since moved). Re-wrap funding and a cross-file move
were both refused per that header: the bullet is already at the block's prose
width, and `AGENTS.md` is not a `CROSS_FILE_MOVES` destination, so no
`ruledRaises` record applies. The widest-table-row leg (pin 768) and every other
ceiling are untouched.

Claude-Session: https://claude.ai/code/session_01TezFG8ZMrNH6n5VTNpPpdH

Co-authored-by: Claude <noreply@anthropic.com>

Copy link
Copy Markdown
Contributor

os-dev-report

Patch round complete — merged main, re-typeset the bullet rules-only, raised the ceiling 1058 → 1068 (dev seat)

Pushed head: f0e9c4c8782ce741523355440063f6c50392bc96 (f0e9c4c87), a plain fast-forward ca2088e3d..f0e9c4c87. No rebase, no amend, no force-push. Draft state, auto-merge and reviews were not touched.

Diff summary — exactly two files

git diff origin/main --stat            (78e8485d6 .. f0e9c4c87)
 AGENTS.md                               | 10 ++++++++++
 scripts/pm/check-skill-line-ratchet.mjs | 12 ++++++++++--
  • AGENTS.md: +10, −0 — the corollary bullet at §11 lines 586–595, directly under the "The driver is a LOCAL facility" sentence. Nothing else in the file changed.
  • scripts/pm/check-skill-line-ratchet.mjs: one CEILINGS entry ['AGENTS.md', 1058]['AGENTS.md', 1068], plus an 11-line comment block above it in the neighbouring style quoting both rulings verbatim and untranslated. MAX_TABLE_ROW_BYTES untouched; no other ceiling touched; no ruledRaises recordCROSS_FILE_MOVES was read and holds exactly one key, .claude/skills/pm-dispatch/references/platform-readings.md, so AGENTS.md is not a destination and none applies.

N and the merge

  • git merge origin/main EXIT=0, clean, no conflicts. Merge commit f171510dc, tree ad22eca70e3b08f1ec764511161754a26686549c — identical to the tree the correction comment measured.
  • wc -l AGENTS.md after the merge = 1068. After the re-typeset = 1068 (the re-wrap is 10 lines in, 10 lines out). ⇒ N = 1068, ceiling 1058 → 1068, headroom 0.
  • The bullet survived at its anchor; verified by reading lines 575–600, not inferred from the merge exit code.
  • Re-typeset: the clause "and it has already cost a seat a round trip" is removed; every rule sentence kept (corollary · mechanism · driver-less bare-clone probe with both commands · the ⛔ -c merge.os-regen.driver= refusal with its reason). Re-wrapped to the surrounding block's measured prose width — widest added line 90 bytes, against 90 bytes widest in the surrounding §11 block (gate hard cap 120). Every inline code span is balanced within its own line.

Gates — 36 derived, 36 run, 36 EXIT=0

Derived at the merge head with node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack (the --repo assertion held against this checkout's origin). Exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?). Nothing in this round is NOT MEASURED.

EXIT command verdict line
0 pnpm check:pm-skill-ratchet ✓ AGENTS.md is 1068 lines (ceiling 1068; headroom 0). + ✓ AGENTS.md: widest table row is 768 bytes (pin 768; headroom 0). + ✓ declared cross-file moves: 1, total ceilings down 9 lines.
0 node scripts/pm/check-skill-line-ratchet.mjs --self-test ✓ check-skill-line-ratchet self-test: 157 cases pass.
0 pnpm check:pm-skill-id-lint ✓ check-skill-id-lint: 26 file(s) clean (pattern /#[0-9]{3,}/g).
0 pnpm check:pm-governed-prose ✓ 2 instruction surface(s) name all 5 registered governed surfaces … and claim no others.
0 pnpm check:nul-bytes check-nul-bytes: OK (scanned 8137 text file(s); skipped 7 binary; no raw ASCII control bytes).
0 pnpm check:agent-test-spelling ✓ 0 violations — 470 file(s) · 7123 bare -- token(s) · 1558 launcher-rooted run(s)
0 pnpm check:pm-governed-merges ✓ check-governed-merges --self-test: 274 assertions
0 pnpm check:pm-dispatch-gates ✓ dispatch-gates self-test: 1534 cases pass.
0 pnpm check:ratchet-remedy-authority OK — 219 scripts swept; 14 mark the expanding remedy ⛔ MAINTAINER-ONLY
0 pnpm check:bash32-floor ✓ 29 tracked shell file(s) name no bash 4+ construct
0 pnpm check:cli-command-ids ✓ 439 command-id literal(s) across 128 file(s) all resolve
0 pnpm check:cross-package-test-inputs OK: 28 package(s) read outside themselves, all declared
0 pnpm check:docs-audit-scope ✓ scope injection is live
0 pnpm check:driver-memory-census OK — every declaration is ledgered, every ledger entry is live
0 pnpm check:entry-guard ✓ 226 scripts/ file(s) — every entry guard goes through invoked-as.mjs
0 pnpm check:parse-guard ✓ 225 scripts/ file(s) — every TypeScript parse goes through ts-parse.mjs.
0 pnpm check:pnpm-filter-targets ✓ 144/188 --filter occurrence(s) across 36 file(s) resolve
0 pnpm check:refd-timer-probe ✓ self-test: 11 cases pass, negative controls included.
0 pnpm check:required-contexts ✓ 6 required context name(s) pinned across 2 workflow(s)
0 pnpm check:watch-hint-literal ✓ 66 declaration(s) across 4 rostered name(s)
0 node packages/lint/scripts/check-reference-carrier-shape.mjs (+ --self-test) OK — 6276 file(s) scanned, 613 reference site(s).
0 node scripts/check-ci-filter-parity.mjs OK: all 169 declared cross-package glob(s) are covered
0 node scripts/check-closing-keyword-parity.mjs (+ --self-test) OK (3 parsers agree on all 9 keywords) · 24 assertions, 5 mutations driven to red
0 node scripts/check-comment-mask-corpus.mjs ✓ 6276 files, 0 disagree, 0 unparseable, 77.9s
0 node scripts/check-declaration-mirrors.mjs (+ --self-test) All 29 self-test cases passed.
0 node scripts/check-scripts-symbol-anchors.mjs (+ --self-test) ✅ 2935 anchors across 226 scripts resolve
0 node scripts/check-self-test-wired.mjs (+ --self-test) ✓ every one of the 183 script(s) CI runs that ship a --self-test has it run by CI.
0 node scripts/check-self-test-workflow-commands.mjs (+ --self-test) ✓ no self-test CI runs prints a line the runner would parse as a workflow command.
0 node scripts/check-whole-set-label-write.mjs (+ --self-test) ✓ 0 violations — 282 file(s) over 3 root(s)
0 node scripts/pm/bare-root-worklist.mjs --self-test OK self-test: 78 live row(s) — none stale, none missing, none contradicted

Governed-surface predicate — node scripts/pm/check-governed-merges.mjs --test AGENTS.md scripts/pm/check-skill-line-ratchet.mjs, EXIT=3:

governed-surface predicate: 1 of 2 path(s) hit the register (5 surfaces, repo-agnostic).
  ⛔  GOVERNED — a human merge is the review record for this PR (#9495 regime).
      AGENTS.md ×1 — the repo-root agent instruction file
  paths not on the register: scripts/pm/check-skill-line-ratchet.mjs

⇒ exit 3 is the expected GOVERNED posture, not a failure.

Ablation — the raised ceiling is load-bearing

Run from a tree where HEAD already carried the implementation, so the restore leg points at it. Mutation proven to reach disk before the reading was taken; restore proven by blob hash, never by an exit code:

HEAD blob:      90e7aa02570849d49397652849ddd8334169e1fd
pre-ablation:   90e7aa02570849d49397652849ddd8334169e1fd
anchor counts:  1068 before=1 after=0 ; 1058 after=1
mutated blob:   d6d3926eab23c122464deddc1ad0d7245075cf72      (differs from HEAD blob: the edit landed)
ABLATION_EXIT=1
✗ check-skill-line-ratchet: AGENTS.md is 1068 lines; the ratchet ceiling is 1058. ...
  Raising a ceiling requires a maintainer ruling quoted in the PR.
restored blob:  90e7aa02570849d49397652849ddd8334169e1fd      (identical to HEAD blob)

git diff HEAD empty and git status clean after restore. Predicted direction RED, observed direction RED, with exactly the 1058-vs-1068 message. Re-run on the restored tree at the final commit: EXIT=0. The script carried trap ... EXIT INT TERM on absolute paths throughout.

Did the maintainer's approval survive the push?

Yes. Reviews read after the push: two APPROVED by os-zhuang, both still APPROVED (neither dismissed), both pinned to the pre-push commit ca2088e3d. Measured — not asserted — through the repo's own predicate, authorizedApprovalVerdict(reviews, 'f0e9c4c87...') from scripts/pm/check-governed-queue-guard.mjs:

GOVERNED_APPROVERS: os-zhuang, hotlong
state: "approved"
approvers: ["os-zhuang"]
approvalsOnEarlierCommits: [{ login: "os-zhuang", commitId: "ca2088e3d..." }]
unauthorizedApprovers: [], changesRequestedBy: []

Per the 2026-09-04 ruling that predicate encodes — 「只需要有人工批准记录就行,不需要卡最新的提交。」 — commit_id is not consulted to reach the verdict, and approvalsOnEarlierCommits is a printed reading that never branches one. So no re-approval is needed on account of this push. Auto-merge was left exactly as armed; no seat flipped ready, enqueued, or approved.

Two housekeeping readings for the director, not acted on

  1. The PR body's trailing attribution footer did not survive the update_pull_request PATCH. The body I sent ended with a rule line plus the bare _Generated by [Claude Code](https://claude.ai/code)_ block; the stored body ends at the 🤖 Generated with [Claude Code] line. I checked the rendered page, not only the API read, per the AGENTS.md rule that a body reading short through the API alone is probably intact — it is absent there too. I did not re-PATCH to re-add it: durable attribution is already in the body prose and the standing rule forbids looping on the footer. Flagging rather than fixing.
  2. The needs-user-decision label is now stale — the ruling it was waiting on has landed and is quoted in the body. Removing it is the director's/PM's call, not mine, so it is untouched.

Structured report

{
  "issue": 15871,
  "status": "done",
  "branch": "claude/issue-15871-agents-merge-tree-corollary",
  "pr": "https://github.com/objectstack-ai/objectstack/pull/15885",
  "premise_still_valid": true,
  "summary": "Patch round on the existing PR #15885, no new branch and no new PR. Merged origin/main (78e8485d6) into the branch as merge commit f171510dc: clean, tree ad22eca70, AGENTS.md 1068 lines, the corollary bullet intact at the LOCAL-facility anchor (SS11 lines 586-595). Re-typeset the bullet in the rules-only voice of PR #15856: the incident clause 'and it has already cost a seat a round trip' removed, every rule sentence kept, re-wrapped to the surrounding block's measured 90-byte prose width (gate cap 120), every code span balanced within its line, 10 lines in and 10 lines out. Raised CEILINGS['AGENTS.md'] 1058 to 1068 with an entry comment quoting both rulings verbatim and untranslated; no ruledRaises record, since CROSS_FILE_MOVES was read and holds only platform-readings.md. Exactly two files changed. Pushed as a fast-forward to f0e9c4c87. PR body updated (body only). Two things flagged not fixed: the body's trailing attribution footer was dropped by GitHub on PATCH (verified absent on the rendered page, not re-posted per the no-footer-loop rule), and the needs-user-decision label is now stale.",
  "tests": "36 gate families derived at the merge head via dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack; all 36 run, all EXIT=0, exit codes captured before any pipe; nothing NOT MEASURED. Load-bearing: pnpm check:pm-skill-ratchet EXIT=0 -- 'AGENTS.md is 1068 lines (ceiling 1068; headroom 0)' and 'widest table row is 768 bytes (pin 768; headroom 0)' and 'declared cross-file moves: 1, total ceilings down 9 lines'; check-skill-line-ratchet.mjs --self-test EXIT=0, 157 cases pass; check-governed-merges.mjs --test EXIT=3 GOVERNED (expected posture). ABLATION: ceiling reverted to 1058 from a committed HEAD carrying the implementation; mutation proven on disk before the reading (anchor counts 1068 1-to-0, 1058 0-to-1; blob 90e7aa025 to d6d3926ea); gate went RED EXIT=1 with the 1058-vs-1068 message; restore proven by blob hash back to 90e7aa025 with git diff HEAD empty; trap EXIT INT TERM on absolute paths; re-run green at the final commit.",
  "mcp_calls": "6",
  "open_questions": [],
  "out_of_scope_findings": []
}

Generated by Claude Code

Copy link
Copy Markdown
Contributor

Patch round landed — head f0e9c4c87; one red remains and it is the by-design kind #16502 ruled on (director seat, 2026-09-07 08:4x UTC)

What landed (dev seat, worktree, plain push): merge of main (f171510dc, clean, the tree the correction comment measured), the corollary re-typeset rules-only at §11 (10 lines in, 10 out, ≤ 90 bytes/line), CEILINGS['AGENTS.md'] 1058 → 1068 with both rulings quoted verbatim in the entry comment, no ruledRaises (AGENTS.md is not a CROSS_FILE_MOVES destination — read, not assumed). 36 gate families derived and run, all exit 0: check:pm-skill-ratchetAGENTS.md is 1068 lines (ceiling 1068; headroom 0); ratchet self-test 157/157; check:pm-dispatch-gates 1534 cases. Ablation: ceiling back to 1058 ⇒ red with the 1058-vs-1068 message; restore proven by blob hash. Approval survival measured through the repo's own authorizedApprovalVerdict on f0e9c4c87: approved, os-zhuang — no re-approval needed. Auto-merge (armed by the maintainer 2026-09-05) is untouched. Stale needs-user-decision label removed.

The one red: Part-of PR must not also close its card. Standing-down note per the #16502 ruling (C), not a fix request:

Nothing further is owed by this PR. The remaining checks are in progress at the time of writing; auto-merge takes it from there.


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queue Sep 7, 2026
Any commits made after this event will not be merged.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

4 participants